﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NovaSystem.ComponentesNegocio;
using NovaSystem.EntidadesNegocio;
using System.Data;
using System.Transactions;
using AnovoAndes.Framework.Utilidades;

namespace NovaSystem.InterfazUsuarioWeb.Ventas
{
    public partial class wfFacturaVenta : System.Web.UI.Page
    {
        private const string CONCEPTO_PAIS = "PAIS";
        private const string CONCEPTO_MONEDA = "MONEDA";
        private const int COL_IDPRODUCTO = 1;
        private const int COL_CODPRODUCTO = 2;

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!Page.IsPostBack)
                {
                    InicializarPagina();
                    LlenarCombos();
                    DefaultCombos();
                }
                FuncionesJavaScript();
            }
            catch (Exception ex)
            {
                
            }
        }

        private void FuncionesJavaScript()
        {
            //string javascript = "function ShowEmptyDataHeader() {";
            //javascript += "var Grid = document.getElementById('" + gvDetalle.ClientID + "');";
            //javascript += "if (Grid != null) {";
            //javascript += "document.getElementById('divDetalleHeader').style.display = 'none';}}";
            //javascript += "window.onload = ShowEmptyDataHeader;";
            ////ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "load", javascript, true);
            //ScriptManager.RegisterStartupScript(this, this.GetType(), "load", javascript, true);

            btnAceptarMsg.Attributes.Add("onclick", "if (document.getElementById('" + txtGrabar.ClientID + "').value == '1'){document.getElementById('" + btnGrabar.ClientID + "').disabled=true;}");
        }

        private void DefaultCombos()
        {
            parametros param = Negocioparametros.Instancia.Listar()[0];
            ddlPais.SelectedValue = param.codigoPaisDefault;
            
        }

        private void LlenarCombos()
        {
            parametros param = Negocioparametros.Instancia.Listar()[0];

            ddlPais.DataSource = Negociomantenedor.Instancia.Listar(CONCEPTO_PAIS);
            ddlPais.DataBind();

            ddlPais.SelectedValue = param.codigoPaisDefault;
        }

        private void InicializarPagina()
        {
            
            txtRutCliente.Attributes.Add("onkeypress", "return clickButton(event,'" + btnBuscarCliente.ClientID + "')");
            txtProducto.Attributes.Add("onkeypress", "return clickButton(event,'" + btnBuscarProducto.ClientID + "')");
            txtCantidad.Attributes.Add("onblur", "var cantidad = " + txtCantidad.ClientID + ".value; var precio = " + txtPrecio.ClientID + ".value;total = parseFloat(cantidad) * parseFloat(precio);" + txtTotal.ClientID + ".value = total;");
            txtPrecio.Attributes.Add("onblur", "var cantidad = " + txtCantidad.ClientID + ".value; var precio = " + txtPrecio.ClientID + ".value;total = parseFloat(cantidad) * parseFloat(precio);" + txtTotal.ClientID + ".value = total;");
            txtFechaFactura.Text = DateTime.Now.ToString("dd-MM-yyyy");
            CrearTablaTemporalDetalle();
            NumeroFactura();
        }

        private void NumeroFactura()
        {
            string usuario = Context.User.Identity.Name;
            login _login = Negociologin.Instancia.BuscaLogin(usuario);
            hfSucursal.Value = _login.sucursal;
            numerofactura _numeroFactura = Negocionumerofactura.Instancia.BuscarUltimoNumero(_login.sucursal);
            int numero = _numeroFactura.ultimoNumero + 1;
            txtNumeroFactura.Text = numero.ToString().PadLeft(8,'0');
        }

        private void CrearTablaTemporalDetalle()
        {
            DataTable tblDetalle = new DataTable();
            DataColumn colIdProducto = new DataColumn("idProducto", typeof(int));
            DataColumn colCodProducto = new DataColumn("producto", typeof(string));
            DataColumn colDesProducto = new DataColumn("descripcion", typeof(string));
            DataColumn colCantidad = new DataColumn("cantidad", typeof(int));
            DataColumn colPrecio = new DataColumn("precio", typeof(decimal));
            DataColumn colTotal = new DataColumn("total", typeof(decimal));
            tblDetalle.Columns.Add(colIdProducto);
            tblDetalle.Columns.Add(colCodProducto);
            tblDetalle.Columns.Add(colDesProducto);
            tblDetalle.Columns.Add(colCantidad);
            tblDetalle.Columns.Add(colPrecio);
            tblDetalle.Columns.Add(colTotal);
            Session["tblDetalle"] = tblDetalle;
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            if (!ValidaSiExiste())
            {
                decimal precio = 0;
                decimal cantidad = 0;
                decimal.TryParse(txtPrecio.Text, out precio);
                decimal.TryParse(txtCantidad.Text, out cantidad);
                divDetalleHeader.Visible = false;

                DataTable tblDetalle = (DataTable)Session["tblDetalle"];
                DataRow nuevaFila = tblDetalle.NewRow();
                nuevaFila["idProducto"] = hfIdProducto.Value;
                nuevaFila["producto"] = txtProducto.Text;
                nuevaFila["descripcion"] = txtDescripcion.Text;
                nuevaFila["cantidad"] = txtCantidad.Text;
                nuevaFila["precio"] = txtPrecio.Text;
                nuevaFila["total"] = (precio * cantidad).ToString();
                tblDetalle.Rows.Add(nuevaFila);
                Session["tblDetalle"] = tblDetalle;
                gvDetalle.DataSource = tblDetalle;
                gvDetalle.DataBind();

                txtCantidad.Text = "";
                txtPrecio.Text = "";
                txtDescripcion.Text = "";
                txtProducto.Text = "";
                hfIdProducto.Value = "";
                txtTotal.Text = "";

                ObtenerTotales();
            }
            else
            {

            }
        }

        private bool ValidaSiExiste()
        {
            DataTable tblDetalle = (DataTable)Session["tblDetalle"];
            foreach (DataRow fila in tblDetalle.Rows)
            {
                if (fila[COL_CODPRODUCTO].ToString().Trim().ToUpper() == txtProducto.Text.Trim().ToUpper())
                {
                    return true;
                }
            }
            return false;
        }

        private void ObtenerTotales()
        {
            try
            {

                parametros param = Negocioparametros.Instancia.Listar()[0];
                DataTable tblDetalle = (DataTable)Session["tblDetalle"];
                decimal subtotal = 0;
                if (tblDetalle.Rows.Count != 0)
                    subtotal = (decimal)tblDetalle.Compute("Sum(total)", "");
                decimal total = 0;
                decimal descuento = 0;
                decimal.TryParse(txtDescuento.Text, out descuento);
                decimal impuesto = (param.impuesto * subtotal) / 100;

                txtSubTotal.Text = subtotal.ToString();
                txtIva.Text = Math.Round(impuesto,0).ToString() ;
                total = subtotal + impuesto;
                txtTotalGeneral.Text = Math.Round(total,0).ToString();
                if (descuento == 0)
                    txtDescuento.Text = "0";


            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        protected void gvDetalle_RowCreated(object sender, GridViewRowEventArgs e)
        {
            e.Row.Cells[COL_IDPRODUCTO].Visible = false;
        }

        protected void OnDelete(object sender, CommandEventArgs e)
        {
            DataTable tblDetalle = (DataTable)Session["tblDetalle"];
            int index = int.Parse(e.CommandArgument.ToString());
            tblDetalle.Rows.RemoveAt(index);
            Session["tblDetalle"] = tblDetalle;
            gvDetalle.DataSource = tblDetalle;
            gvDetalle.DataBind();
            ObtenerTotales();
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            txtGrabar.Text = "";
            if (ValidarDatosGrabar())
            {
                try
                {
                    int idFactura = 0;
                    int numeroFactura = 0;
                    int idCliente = 0;
                    int ordenCompra = 0;
                    decimal subtotal = 0;
                    decimal impuesto = 0;
                    decimal total = 0;
                    decimal descuento = 0;
                    DateTime fechaFactura = new DateTime(1900, 1, 1);


                    int.TryParse(txtNumeroFactura.Text, out numeroFactura);
                    DateTime.TryParse(txtFechaFactura.Text, out fechaFactura);
                    int.TryParse(hfIdCliente.Value, out idCliente);
                    int.TryParse(txtOrdenCompra.Text, out ordenCompra);
                    decimal.TryParse(txtSubTotal.Text, out subtotal);
                    decimal.TryParse(txtIva.Text, out impuesto);
                    decimal.TryParse(txtTotalGeneral.Text, out total);
                    decimal.TryParse(txtDescuento.Text, out descuento);

                    DataTable tblDetalle = (DataTable)Session["tblDetalle"];

                    using (TransactionScope tran = new TransactionScope())
                    {
                        facturaventa factura = new facturaventa();
                        factura.numeroFactura = numeroFactura;
                        factura.fechaFactura = fechaFactura;
                        factura.idCliente = idCliente;
                        factura.afectaExenta = ddlAfectaExcenta.SelectedValue;
                        factura.direccion = txtDireccionCliente.Text;
                        factura.conceptoPais = CONCEPTO_PAIS;
                        factura.codigoPais = ddlPais.SelectedValue;
                        factura.OrdenCompraRef = txtOrdenCompra.Text;
                        factura.subTotal = subtotal;
                        factura.impuesto = impuesto;
                        factura.total = total;
                        factura.descuento = descuento;
                        factura.observacion = txtObservacion.Text;
                        factura.usuario = Context.User.Identity.Name;
                        int.TryParse(Negociofacturaventa.Instancia.Insertar(factura), out idFactura);



                        foreach (DataRow fila in tblDetalle.Rows)
                        {
                            int cantidad = 0;
                            int idProducto = 0;
                            decimal precio = 0;
                            decimal totaldet = 0;
                            int.TryParse(fila["cantidad"].ToString(), out cantidad);
                            int.TryParse(fila["idProducto"].ToString(), out idProducto);
                            decimal.TryParse(fila["precio"].ToString(), out precio);
                            decimal.TryParse(fila["total"].ToString(), out totaldet);

                            facturaventadet facturadet = new facturaventadet();
                            facturadet.cantidad = cantidad;
                            facturadet.idProducto = idProducto;
                            facturadet.descripcionProducto = fila["descripcion"].ToString();
                            facturadet.idFactura = idFactura;
                            facturadet.precio = precio;
                            facturadet.total = totaldet;
                            facturadet.usuario = Context.User.Identity.Name;
                            Negociofacturaventadet.Instancia.Insertar(facturadet);
                        }

                        Negocionumerofactura.Instancia.ActualizaNumeroFactura(hfSucursal.Value, int.Parse(txtNumeroFactura.Text));

                        tran.Complete();
                        txtGrabar.Text = "1";
                        lblMsg.Text = "El registro se ha guardado con éxito";
                        mpeMensaje.Show();
                    }



                }
                catch (Exception ex)
                {
                    ControlErrores.ErrorUsuario(ex, HttpContext.Current, "");
                }

            }
            else
            {
                mpeMensaje.Show();
            }
        }
        private bool ValidarDatosGrabar()
        {
            try
            {
                lblMsg.Text="";
                if (txtNombreCliente.Text.Trim()=="")
                    lblMsg.Text ="Nombre del Cliente es Obligatorio <br/>";
                if (txtFechaFactura.Text.Trim()=="")
                    lblMsg.Text="Fecha Factura es Obligatorio <br/>"    ;
                if (txtDireccionCliente.Text.Trim()=="")
                    lblMsg.Text="Dirección del Cliente es Obligatoria";
                if (gvDetalle.Rows.Count == 0)
                    lblMsg.Text = "Debe agregar Algun detalle";
                if (txtTotal.Text == "")
                    lblMsg.Text = "Total no puede ser 0";

                if (lblMsg.Text == "")
                    return true;
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        protected void btnBuscarProveedor_Click(object sender, ImageClickEventArgs e)
        {
            if (txtRutCliente.Text.Length > 0)
            {
                string rut = txtRutCliente.Text.Replace(".", "").Replace("-", "");
                cliente _cliente = Negociocliente.Instancia.BuscarRut(rut);
                if (_cliente != null)
                {
                    txtNombreCliente.Text = _cliente.nombreCliente;
                    hfIdCliente.Value = _cliente.idCliente.ToString();
                }
                else
                {
                    //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "click", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "');return false;", true);
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('wfBCliente.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtRutCliente.ClientID + "').value=o.value;document.getElementById('" + txtNombreCliente.ClientID + "').value = o.text;document.getElementById('" + hfIdCliente.ClientID + "').value=o.aux;}", true);
                }
            }
            else
            {
                //Page.ClientScript.RegisterClientScriptBlock(GetType(), "onclick", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "');return false;", true);
                ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('wfBCliente.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtRutCliente.ClientID + "').value=o.value;document.getElementById('" + txtNombreCliente.ClientID + "').value = o.text;document.getElementById('" + hfIdCliente.ClientID + "').value=o.aux;}", true);
                //ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "click", "ModalPopup3('wfBCliente.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutCliente.ClientID + "','" + txtNombreCliente.ClientID + "','" + hfIdCliente.ClientID + "')", true);
            }

        }

        protected void btnBuscarProducto_Click(object sender, ImageClickEventArgs e)
        {
            if (txtProducto.Text.Length > 0)
            {
                producto _producto = Negocioproducto.Instancia.BuscarProductoCodigo(txtProducto.Text);
                if (_producto != null)
                {
                    txtDescripcion.Text = _producto.descripcion;
                    hfIdProducto.Value = _producto.idProducto.ToString();
                }
                else
                {
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('" + Page.ResolveUrl("~") + "Logistica/wfBProducto.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtProducto.ClientID + "').value=o.value;document.getElementById('" + txtDescripcion.ClientID + "').value = o.text;document.getElementById('" + hfIdProducto.ClientID + "').value=o.aux;}", true);
                }
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "click", "var o=window.showModalDialog('" + Page.ResolveUrl("~") + "Logistica/wfBProducto.aspx',null,'dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes');if (o!=null){document.getElementById('" + txtProducto.ClientID + "').value=o.value;document.getElementById('" + txtDescripcion.ClientID + "').value = o.text;document.getElementById('" + hfIdProducto.ClientID + "').value=o.aux;}", true);
            }
        }

        protected void btnLimpiar_Click(object sender, EventArgs e)
        {
            NumeroFactura();
            Session["tblDetalle"] = null;
            txtGrabar.Text = "";
            gvDetalle.DataSource = null;
            gvDetalle.DataBind();
            divDetalleHeader.Visible = true;
            txtRutCliente.Text = "";
            hfIdCliente.Value = "";
            hfIdProducto.Value = "";
            txtNombreCliente.Text = "";
            txtFechaFactura.Text = "";
            txtOrdenCompra.Text = "";
            txtDireccionCliente.Text = "";
            txtProducto.Text = "";
            txtDescripcion.Text = "";
            txtCantidad.Text = "";
            txtPrecio.Text = "";
            txtTotal.Text = "";
            txtObservacion.Text = "";
            txtSubTotal.Text="";
            txtIva.Text = "";
            txtDescuento.Text = "";
            txtTotalGeneral.Text = "";
        }

 
    }
}
